var Disciplina = require('./../classes/disciplina');
var Departamento = require('./../classes/departamento');
var Curso = require('./../classes/curso');
var DisciplinaDAO = require('./../DAO/disciplina.dao');
var CursoModel = require('./../models/curso.model').Curso;
var DepartamentoModel = require('./../models/departamento.model');

function DisciplinaMapper() {
    var dao = new DisciplinaDAO();

    this.disciplinaToModel = function(d, callback) {
        var m = new dao.getModel();

        m.nome = d.getNome();
        m.carga = d.getCarga();
        var curso = d.getCurso();
        var dep = curso.getDepartamento();
        m.curso.push({
            nome: curso.getNome(),
            departamento: [{nome: dep.getNome()}] //beware this must be a DEPARTAMENTO MODEL
        });
        callback(m);
    }

    this.modelToDisciplina = function(m, callback) {
        if (m instanceof Array) {
            var out = [];
            m.forEach(function(disc) {
                var d = new Disciplina();
                var c = new Curso();
                var dep = new Departamento();
                dep.setNome(disc.curso[0].departamento[0].nome);
                c.setNome(disc.curso[0].nome);
                c.setDepartamento(dep);
                d.setId(disc._id);
                d.setNome(disc.nome);
                d.setCarga(disc.carga);
                d.setCurso(c);
                out.push(d);
            });
            callback(out);
        }
        else {
            var d = new Disciplina();
            var c = new Curso();
            var dep = new Departamento();
            dep.setNome(m.curso[0].departamento[0].nome);
            c.setNome(m.curso[0].nome);
            c.setDepartamento(dep);
            d.setId(m._id);
            d.setNome(m.nome);
            d.setCarga(m.carga);
            d.setCurso(c);
            callback(d);
        }
    }

    this.add = function(disc, callback) {
        this.disciplinaToModel(disc, function(m) {
            dao.add(m, callback);
        });
    }

    this.get = function(nome, callback) {
        var that = this
        dao.get(nome, function(err, doc) {
            that.modelToDisciplina(doc, function(d) {
                callback(err, d);
            });
        });
    }

    this.getById = function(id, callback) {
        var that = this;
        dao.get(id, function(err, doc) {
            if(err) throw new Error('Not found!');
            that.modelToDisciplina(doc, function(disc) {
                callback(err, disc);
            });
        });
    }

    //TODO
    //update


    this.remove = function(disc, callback) {
        this.disciplinaToModel(disc, function(m) {
            dao.remove(m, callback);
        });
    }

    this.getAll = function(callback) {
        var that = this;
        dao.getAll(function(err, all) {
            that.modelToDisciplina(all, function(all) {
                callback(err, all);
            });
        });
    }
}

module.exports = DisciplinaMapper;
